package fr.utbm.tx52.core;

import java.net.*;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


/**
 * La classe principale du serveur, elle va attendre les connexion entrantes.
 */
public class Server {

	/**
	 * Port utilisé sur le serveur
	 */
	private static final int port = 8081;
	
	
	/**
	 * Liste des clients connectés <Téléphone, Socket>
	 */
	private List<ClientThread> m_clients = new ArrayList<ClientThread>();


	public Server()
	{
		try
		{
			ServerSocket s = new ServerSocket(port);

			System.out.println("- Serveur launched -");

			new Commande(this); // lance le thread de gestion des commandes

			while (true) // attente en boucle de connexion (bloquant sur ss.accept)
			{
				m_clients.add( 
						new ClientThread(s.accept(), this)	// un client se connecte, un nouveau thread client est lancé
					); 
				System.out.println("- Client connected -");
			}
		}
		catch (Exception e) { 
			System.out.println("- Erreur lors du lancement du serveur -");
			System.out.println(e.getMessage());
		}
	}


	/** 
	 * Supprime un client de la liste
	 * 
	 * @param id
	 * 			L'identifiant (numéro de téléphone) du client
	 */
	synchronized public void delClient(ClientThread ct)
	{
		System.out.println("Deconnexion d'un client");
		m_clients.remove(ct);
	}


	/**
	 * Affiche la liste des clients connectés
	 */
	synchronized public void printClientList()
	{
		System.out.println("Connected (" + m_clients.size() + ") :\n---------------------------");
		for (ClientThread ct : m_clients) {
			System.out.println(ct.getClientName());
		}
		System.out.println("---------------------------");
	}
	

}
